Package com.python.pydev.analysis.visitors

Source Code of com.python.pydev.analysis.visitors.DuplicationChecker

/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
/*
* Created on 24/07/2005
*/
package com.python.pydev.analysis.visitors;

import java.util.HashMap;
import java.util.Map;

import org.python.pydev.core.structure.FastStack;
import org.python.pydev.editor.codecompletion.revisited.modules.SourceToken;
import org.python.pydev.editor.codecompletion.revisited.visitors.AbstractVisitor;
import org.python.pydev.parser.jython.SimpleNode;
import org.python.pydev.parser.jython.ast.ClassDef;
import org.python.pydev.parser.jython.ast.FunctionDef;
import org.python.pydev.parser.jython.ast.decoratorsType;
import org.python.pydev.parser.visitors.NodeUtils;

import com.python.pydev.analysis.IAnalysisPreferences;

/**
* Used to check for duplicated signatures
*
* @author Fabio
*/
public final class DuplicationChecker {

    /**
     * used to know the defined signatures
     */
    private final FastStack<Map<String, String>> stack = new FastStack<Map<String, String>>(10);
    private final Scope scope;
    private final MessagesManager messagesManager;

    /**
     * constructor
     * @param visitor
     */
    public DuplicationChecker(OccurrencesVisitor visitor) {
        startScope("", null);
        this.scope = visitor.scope;
        this.messagesManager = visitor.messagesManager;
    }

    /**
     * we are starting a new scope (method or class)
     */
    private void startScope(String name, SimpleNode node) {
        checkDuplication(name, node);
        Map<String, String> item = new HashMap<String, String>();
        stack.push(item);
    }

    /**
     * we are ending a scope
     */
    private void endScope(String name) {
        stack.pop();
        stack.peek().put(name, name);
    }

    /**
     * checks if some name is already defined (and therefore, this can be a duplication)
     */
    private void checkDuplication(String name, SimpleNode node) {
        if (stack.size() > 0) {
            if (!scope.getPrevScopeItems().getIsInSubSubScope()) {
                String exists = stack.peek().get(name);
                if (exists != null) {
                    if (node instanceof FunctionDef) {
                        FunctionDef functionDef = (FunctionDef) node;
                        if (functionDef.decs != null && functionDef.decs.length > 0) {
                            for (decoratorsType dec : functionDef.decs) {
                                if (dec.func != null) {
                                    String fullRepresentationString = NodeUtils.getFullRepresentationString(dec.func);
                                    if (fullRepresentationString.startsWith(name + ".")) {
                                        return;
                                    }
                                }
                            }
                        }

                    }
                    SourceToken token = AbstractVisitor.makeToken(node, "");
                    messagesManager.addMessage(IAnalysisPreferences.TYPE_DUPLICATED_SIGNATURE, token, name);
                }
            }
        }
    }

    public void beforeClassDef(ClassDef node) {
        startScope(NodeUtils.getRepresentationString(node), node);
    }

    public void afterClassDef(ClassDef node) {
        endScope(NodeUtils.getRepresentationString(node));
    }

    public void beforeFunctionDef(FunctionDef node) {
        startScope(NodeUtils.getRepresentationString(node), node);
    }

    public void afterFunctionDef(FunctionDef node) {
        endScope(NodeUtils.getRepresentationString(node));
    }

}
TOP

Related Classes of com.python.pydev.analysis.visitors.DuplicationChecker

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.